<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
  </head>

  <body>
    <!-- 
    ！注意写上题目题数
    例如 ：
    1、选择题
        (1) D
        (2) C
        (3) true fasle fasle 
        (4) B ?????????????
        (5) C
        ...
    2、填空题
        (1)获取节点：document.querySelector / document.querySelectorAll / document.getElementById
                    document.getElementsByClassName / document.getElementsByName / document.getElementsByTagName
           创建节点：document.createElement / 
           添加节点：node.appendChild() / node.append(element) / node.innerHTML
        (2) object.__proto__ === Object.prototype 为true

            fn.__proto__ === Function.prototype 为true
            fn.__proto__.__proto__ === Object.prototype 为true

            array.__proto__ === Array.prototype 为true
            array.__proto__.__proto__ === Object.prototype 为true

            Function.__proto__ === Function.prototype 为true
            Array.__proto__ === Array.prototype 为true
            Object.__proto__ === Function.prototype 为true

            true.__proto__ ===  Boolean.prototype 为true

            Function.prototype.__proto__ === Object.prototype 为true 

    3、描述题
        (1) ajax是一种无需刷新加载整个页面的情况下，能够更新部分网页内容的技术，通过执行异步网络请求创建动态网页的技术

        (2) 构造函数的this指向的是构造函数的实例化对象，也就是Fn;this的属性是prototype，而this.prototype又指向Object，
            所以它的属性又有hasOwnProperty以及isPrototypeOf属性

        (3) js调控同步任务和异步任务的机制叫时间循环(event loop)。当主线程的同步任务全部完成之后
            任务队列中异步任务的回调函数就会回到执行栈中执行，也就是事件循环。

        (4) 每一个JS函数中都有一个prototype（原型）属性，指向这个函数的原型对象，
            通过这个函数产生的实例对象都有一个__proto__（隐式原型）属性，这个属性也是指向同一个原型对象，
            所有的实例对象的属性都会继承这个原型对象的属性，原型对象上也有一个__proto__属性，指向的objec原型对象， 所有的对象属性都会继承objec原型对象属性。
            而object原型对象的__proto__指向的是null。当我们访问对象的某个属性时，就会从实例对象，原型对象，object原型对象上层层寻找，由此形成原型链。而原型就是原型对象上的属性。
        
    4、逻辑题
        (1) Goodbye jack!

        (2) 10 

        (3) 21

        (4) 667

        (5) Hy   Jack

        (6) Jack HanMeiHmei

        (7) 1 test is not a function 2

    5、实操题
        (1)
            <script>
                let Animal = function (type) {
                    this.type = type;
                };
                Animal.prototype.eat = function () {
                    console.log("like eat food");
                };
                let dog = new Animal("dog");
                let cat = new Animal("cat");
                console.log(dog);
                console.log(cat);

                cat.constructor.prototype.eat = function () {
                    console.log("haihai1");
                };
                dog.eat();
                cat.eat();
            </script>

        (2)
            <script>
            function ajaxPromiseFn(_url, _data, _method) {

                let method = _method || "GET";
                let data = _data || null;

                return Promise((resolve, reject) => {
                let xhr = new XMLHttpRequest();

                if (method.toUpperCase() == "GET") {
                    let str = "?";

                    for (let k in data) {
                    str += `${k}=${data[k]}&`;
                    }
                    str = str.slice(0, -1);

                    xhr.open(method, _url + str);

                } else {
                    xhr.open(method, _url);
                }

                xhr.addEventListener("readystatechange", () => {
                    if (xhr.readyState == 4) {
                    if (xhr.status == 200) {
                        resolve(JSON.parse(xhr.responseText));
                    } else {
                        reject(JSON.parse(xhr.responseText));
                    }
                    }
                });
                });
            }
            </script>   
            
        (3)
            <script>
                let arr = [1, 2, 5, 2, 4, 5, 10, 2, 5, 1, 2, 4, 5, 8, 6, 4];

                //  方法一
                let arrN1 = [];
                arr.forEach((item, index) => {
                    if (!arrN1.includes(item)) {
                    arrN1.push(item);
                    }
                });
                console.log(arrN1);

                //  方法二
                let arrN2 = [];
                arr.forEach((item, index) => {
                    if (arrN2.indexOf(item) == -1) {
                    arrN2.push(item);
                    }
                });
                console.log(arrN2);

                // 方法三
                let arrN3 = arr.filter((item, index) => {
                    return arr.indexOf(item) == index;
                });
                console.log(arrN3);

                // 方法四
                let arrN4 = [...new Set(arr)];
                console.log(arrN4);
            </script>        
    -->
    <script>
      //   var object = {}
      //   var fn = function(){}
      //   var array = []
      //   console.log(Object.__proto__ === Function.prototype  );
      //   function Fn() {
      //     console.log(this);
      //   }
      //   new Fn();
    </script>
  </body>
</html>
